/**
*	OMaster - Cheating Tool OGame
Door: Peter Evers
Datum: 9 Juli 2007 (morgen is mijn mama jarig!)

	Bestand: omaster.cpp
	Beschrijving:
	Dit bestand is het hoofdbestand en koppelt grafisch en technisch aan elkaar.
	
**/


#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <iostream>
#include "game.h"
using namespace std;

#define		LOGIN_PAR		0x01
#define		HOST_PAR		0x02

#ifndef _WIN32
#include <unistd.h>
#include <termios.h>
int mygetch( )
{
    struct termios oldt,
		newt;
    int ch;
    tcgetattr( STDIN_FILENO, &oldt );
    newt = oldt;
    newt.c_lflag &= ~( ICANON | ECHO );
    tcsetattr( STDIN_FILENO, TCSANOW, &newt );
    ch = getchar();
    tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
    return ch;
}
#endif
#ifdef _WIN32
#include <windows.h>
int mygetch() 
{
    DWORD mode;
    TCHAR Tch = 0;
    DWORD count;
	
    HANDLE hcons = GetStdHandle(STD_INPUT_HANDLE);
    GetConsoleMode(hcons, &mode);
    SetConsoleMode(hcons, 0);       
    ReadConsole(hcons, &Tch, sizeof(TCHAR), &count, NULL);
    SetConsoleMode(hcons, mode);               
    return (char)Tch;      // FUCK UNICODE!
} 
#endif



/**
* Vraagt om invoer en zorgt er voor dat elk karakter vervangen wordt door een asterix!
*/


void GetPassword(char* &pass, int size)
{
	pass = new char[size];
	char ch = 1;
	int i = 0;
	
	std::cout << "Wachtwoord: ";
	
	while ((ch = mygetch())
		&& (ch != '\n') && (ch != 13)
		&& (i < size))
	{
		if((int)ch == 127)
		{
			if(i == 0)
				continue;
			std::cout << "\b \b";
			i--;
		}
		else
		{
			std::cout << "*";
			pass[i++] = (char)ch;
		}
	}
	pass[i] = '\0';
}

/**
* Laat overzicht van codes zien!
*/
void DisplayCodes()
{
    // TODO
}

int main(int argc, char *argv[])
{
	char user[512], host[512];
	bool speed_server = false;
	int i = 1; FLAG required = 0; 	// Voor argumenten
	
	if(argc <= 1)
	{
		std::cout << "Geen parameters opgegeven, gebruik: " << std::endl;
		std::cout << "omaster [LOGIN...] [GEBOUWEN...] " << std::endl << std::endl;
		std::cout << "Verplichte login opties gevolgd door gegevens: " << std::endl;
		std::cout << "  -u \t\t loginnaam" << std::endl;
		std::cout << "  -h \t\t host-naam (bijv. uni12.ogame.nl)" << std::endl << std::endl;
		std::cout << "Optionele velden: " << std::endl;
		std::cout << "  -s \t\t speedserver" << std::endl << std::endl;
		
		mygetch();
		
		exit(0);
	}
	else
	{
		while((i < argc) && (argv[i][0] == '-'))
		{
			if(strcmp(argv[i], "-u") == 0)
			{
				strcpy(user, argv[i+1]);
				required |= LOGIN_PAR;
				i++;
			}
			if(strcmp(argv[i], "-h") == 0)
			{
				strcpy(host, argv[i+1]);
				required |= HOST_PAR;
				i++;
			}
			if(strcmp(argv[i], "-s") == 0)
			{
				speed_server = true;
			}
			i++;
		}			
	}
	
	if(required != (LOGIN_PAR | HOST_PAR))
	{
		std::cout << "Geen gebruikersnaam en/of host opgegeven, typ: omaster voor uitleg" << std::endl;
		mygetch();
		exit(0);
	}
	
	std::cout << " ---|| Starting OMaster!! || --- " << std::endl;
	WaitConsole(2000);
	
	CGame game;
	char *pass = NULL;
	GetPassword(pass, 256);
	if(game.StartLogin(user, pass, host, speed_server) != CON_SUCCESS)
	{
        std::cout << "Error: fout bij het inloggen!" << std::endl;
        mygetch();
		exit(0);
	}
	delete[] pass;
	
	// Voeg gebouwen toe
	ClearConsole();
	std::cout << "---|| Overzicht Codes || --- " << std::endl;
	DisplayCodes();
	
	char input[256];
	std::cout << "Voer gebouw in gevolgd door \',\' en de planeet (0 = hoofdplaneet, 1 = eerste kolonie, enz.): " << std::endl;
	std::cout << "Voer 'stop' in om door te gaan naar de volgende stap!" << std::endl;
	std::cout << "\tVb. 1,0 (Kristalmijn op hoofdplaneet)" << std::endl;
	
	while(1)
	{
		cin.getline(input, 256);
		if(strcmp(input, "stop") == 0)
			break;
		if((strlen(input) != 3) || !isdigit(input[0]) || !isdigit(input[2]))
		{
			std::cout << "Ongeldige invoer, voer opnieuw in: " << std::endl;
		}
		else
		{
			if(game.AddBuilding(atoi(&input[0]), atoi(&input[2])) == false)
				std::cout << "Gebouw/Planeet onbekend: " << input << std::endl;
		}
	}
	
	
	
	int ret;
	if((ret = game.RunBuilder()) != RUN_SUCCESS)
	{
		std::cout << endl << "Fout bij het uitvoeren van OMaster ... foutcode: " << ret << std::endl;
	}
	
	// Start builder
	mygetch();
	return 0;
}
